import * as XLSX from 'xlsx'; // 如果使用 npm

/**
 * 将 JSON 数据导出为 Excel 文件
 * @param {Array} jsonData - 要导出的 JSON 数据数组
 * @param {Object} options - 配置选项
 * @param {string} options.fileName - 文件名，默认为 'data.xlsx'
 * @param {string} options.sheetName - 工作表名称，默认为 'Sheet1'
 * @param {Object} options.headers - 自定义表头映射 { key: '显示名称' }
 * @param {Array} options.columns - 指定要导出的列（按顺序）
 * @param {boolean} options.autoWidth - 是否自动调整列宽，默认为 true
 * @param {Object} options.cellStyle - 单元格样式配置
 * @returns {Promise<boolean>} 导出是否成功
 */
export function exportToExcel(jsonData, options = {}) {
  try {
    // 参数验证
    if (!Array.isArray(jsonData) || jsonData.length === 0) {
      console.warn('导出数据为空或格式不正确');
      return Promise.resolve(false);
    }

    // 默认配置
    const config = {
      fileName: 'data.xlsx',
      sheetName: 'Sheet1',
      headers: {},
      columns: [],
      autoWidth: true,
      cellStyle: {},
      ...options
    };

    // 处理数据
    let processedData = [...jsonData];

    // 如果指定了列，则只导出指定列
    if (config.columns.length > 0) {
      processedData = jsonData.map(item => {
        const newItem = {};
        config.columns.forEach(col => {
          newItem[col] = item[col];
        });
        return newItem;
      });
    }

    // 如果有自定义表头，则重命名列
    if (Object.keys(config.headers).length > 0) {
      processedData = processedData.map(item => {
        const newItem = {};
        Object.keys(item).forEach(key => {
          const newKey = config.headers[key] || key;
          newItem[newKey] = item[key];
        });
        return newItem;
      });
    }

    // 创建工作簿
    const wb = XLSX.utils.book_new();
    
    // 将 JSON 数据转换为工作表
    const ws = XLSX.utils.json_to_sheet(processedData);

    // 自动调整列宽
    if (config.autoWidth) {
      const colWidths = [];
      const keys = Object.keys(processedData[0] || {});
      
      keys.forEach((key, index) => {
        let maxWidth = key.length;
        processedData.forEach(row => {
          const cellValue = String(row[key] || '');
          maxWidth = Math.max(maxWidth, cellValue.length);
        });
        colWidths[index] = { wch: Math.min(maxWidth + 2, 50) }; // 限制最大宽度
      });
      
      ws['!cols'] = colWidths;
    }

    // 添加样式（如果需要）
    if (Object.keys(config.cellStyle).length > 0) {
      // 这里可以添加更复杂的样式逻辑
      // XLSX 的样式需要额外的库支持
    }

    // 将工作表添加到工作簿
    XLSX.utils.book_append_sheet(wb, ws, config.sheetName);
    
    // 生成文件名（确保有 .xlsx 扩展名）
    const finalFileName = config.fileName.endsWith('.xlsx') 
      ? config.fileName 
      : `${config.fileName}.xlsx`;

    // 生成 Excel 文件并下载
    XLSX.writeFile(wb, finalFileName);
    
    console.log(`Excel 文件 "${finalFileName}" 导出成功`);
    return Promise.resolve(true);

  } catch (error) {
    console.error('Excel 导出失败:', error);
    return Promise.resolve(false);
  }
}

/**
 * 多工作表导出
 * @param {Array} sheetsData - 多个工作表数据 [{ name: 'Sheet1', data: [...] }, ...]
 * @param {string} fileName - 文件名
 * @returns {Promise<boolean>} 导出是否成功
 */
export function exportMultiSheetExcel(sheetsData, fileName = 'data.xlsx') {
  try {
    if (!Array.isArray(sheetsData) || sheetsData.length === 0) {
      console.warn('工作表数据为空');
      return Promise.resolve(false);
    }

    const wb = XLSX.utils.book_new();

    sheetsData.forEach((sheet, index) => {
      if (!sheet.data || !Array.isArray(sheet.data) || sheet.data.length === 0) {
        console.warn(`工作表 ${sheet.name || `Sheet${index + 1}`} 数据为空`);
        return;
      }

      const ws = XLSX.utils.json_to_sheet(sheet.data);
      const sheetName = sheet.name || `Sheet${index + 1}`;
      XLSX.utils.book_append_sheet(wb, ws, sheetName);
    });

    const finalFileName = fileName.endsWith('.xlsx') ? fileName : `${fileName}.xlsx`;
    XLSX.writeFile(wb, finalFileName);
    
    console.log(`多工作表 Excel 文件 "${finalFileName}" 导出成功`);
    return Promise.resolve(true);

  } catch (error) {
    console.error('多工作表 Excel 导出失败:', error);
    return Promise.resolve(false);
  }
}

/**
 * 从表格元素导出 Excel
 * @param {string|HTMLElement} tableSelector - 表格选择器或表格元素
 * @param {string} fileName - 文件名
 * @returns {Promise<boolean>} 导出是否成功
 */
export function exportTableToExcel(tableSelector, fileName = 'table.xlsx') {
  try {
    const table = typeof tableSelector === 'string' 
      ? document.querySelector(tableSelector)
      : tableSelector;

    if (!table) {
      console.warn('未找到指定的表格元素');
      return Promise.resolve(false);
    }

    const wb = XLSX.utils.table_to_book(table);
    const finalFileName = fileName.endsWith('.xlsx') ? fileName : `${fileName}.xlsx`;
    
    XLSX.writeFile(wb, finalFileName);
    
    console.log(`表格 Excel 文件 "${finalFileName}" 导出成功`);
    return Promise.resolve(true);

  } catch (error) {
    console.error('表格 Excel 导出失败:', error);
    return Promise.resolve(false);
  }
}

// 使用示例
export const exampleUsage = {
  // 基础用法
  basic: () => {
    const data = [
      { id: 1, name: "张三", age: 25, city: "北京" },
      { id: 2, name: "李四", age: 30, city: "上海" }
    ];
    exportToExcel(data, { fileName: '用户数据.xlsx' });
  },

  // 自定义表头
  customHeaders: () => {
    const data = [
      { id: 1, name: "张三", age: 25 },
      { id: 2, name: "李四", age: 30 }
    ];
    exportToExcel(data, {
      fileName: '用户信息.xlsx',
      headers: {
        id: '用户ID',
        name: '姓名',
        age: '年龄'
      }
    });
  },

  // 指定列导出
  specificColumns: () => {
    const data = [
      { id: 1, name: "张三", age: 25, password: "123456", city: "北京" },
      { id: 2, name: "李四", age: 30, password: "654321", city: "上海" }
    ];
    exportToExcel(data, {
      fileName: '用户基本信息.xlsx',
      columns: ['id', 'name', 'age'], // 不导出密码字段
      headers: {
        id: '用户ID',
        name: '姓名',
        age: '年龄'
      }
    });
  },

  // 多工作表导出
  multiSheet: () => {
    const usersData = [
      { id: 1, name: "张三", age: 25 },
      { id: 2, name: "李四", age: 30 }
    ];
    const ordersData = [
      { orderId: 1001, userId: 1, amount: 100 },
      { orderId: 1002, userId: 2, amount: 200 }
    ];
    
    exportMultiSheetExcel([
      { name: '用户数据', data: usersData },
      { name: '订单数据', data: ordersData }
    ], '业务数据.xlsx');
  }
}; 